home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
CRS
/
crs49.d81
/
hack#3b.sfx
/
hack#3-4.txt
< prev
Wrap
Text File
|
1990-02-12
|
18KB
|
710 lines
3.4. ╨┴├╦┴╟┼ ╒╙┴╟┼
╘HE FOLLOWING PSEUDO-CODE OUTLINES HOW A USER PROGRAM IS EXPECTED TO USE THE
BURST READING PACKAGE:
. JSR PUT_FILENAME_INTO_BURST┬UF
. LDX #FILENAME_LENGTH
. LDA #DEVICE_NUMBER
. JSR BURST╧PEN
. BCS REPORT┼RROR
. ╠1: JSR PROCESS_BURST┬UF_DATA
. LDA BURST╙TATUS
. CMP #$1F
. BEQ ╠2
. JSR BURST╥EAD
. BCC ╠1
. JSR REPORT┼RROR
. ╠2: JSR BURST├LOSE
4. ╔═╨╠┼═┼╬╘┴╘╔╧╬
╘HIS SECTION DISCUSSES THE CODE THAT IMPLEMENTS THE WORD COUNTING PROGRAM. ╔T
IS HERE IN A SPECIAL FORM; EACH CODE LINE IS PRECEEDED BY A FEW SPECIAL
CHARACTERS AND THE LINE NUMBER. ╘HE SPECIAL CHARACTERS ARE THERE TO ALLOW YOU
TO EASILY EXTRACT THE ASSEMBLER CODE FROM THE REST OF THIS MAGAZINE (AND ALL
OF MY UGLY COMMENTS). ╧N A ╒NIX SYSTEM, ALL YOU HAVE TO DO IS EXECUTE THE
FOLLOWING COMMAND LINE (SUBSTITUTE FILENAMES AS APPROPRIATE):
GREP '^\.%...\!' ╚ACK3 ▄ SED 'S/^.%...\!..//' ▄ SED 'S/.%...\!//' >WC.ASM
.%001! ;╫ORD ├OUNT UTILITY USING THE BURST COMMAND SET'S ╞ASTLOAD FACILITY
.%002! ;WRITTEN 92/06/25 BY ├RAIG ┬RUCE FOR ├= ╚ACKING ╬ET ═AGAZINE
.%003!
╘HE CODE IS WRITTEN FOR THE ┬UDDY ASSEMBLER AND HERE ARE A FEW SETUP
DIRECTIVES.
.%004! .MEM
.%005! .BANK 15
.%006! .ORG $1C01
.%007!
.%008! ;*** ┬┴╙╔├ STARTUP CODE
.%009!
╘HIS IS WHAT THE "10 SYS 7200" IN ┬┴╙╔├ LOOKS LIKE. ╔T IS HERE SO THIS
PROGRAM CAN BE EXECUTED WITH ┬┴╙╔├ ╥╒╬ COMMAND.
.%010! .WORD $1C1C
.%011! .WORD 10
.%012! .BYTE $9E
.%013! .ASC " 7200 : "
.%014! .BYTE $8F
.%015! .ASC " 6502 POWER!"
.%016! .BYTE 0
.%017! .WORD 0
.%018! .WORD 0
.%019!
.%020! JMP MAIN
.%021!
.%022! ;========== BURST READ LIBRARY ==========
.%023!
.%024! BURST╙TATUS = $FE
.%025! BURST┬UF├OUNT = $FF
.%026! BURST┬UF = $B00
"SERIAL╞LAG" IS USED TO DETERMINE WHETHER A DEVICE IS ╞AST OR NOT, AND THE
"IO╙TATUS" (A.K.A. "╙╘") IS TO TELL IF A DEVICE IS PRESENT OR NOT.
.%027! SERIAL╞LAG = $A1C
.%028! IO╙TATUS = $90
"CIA╔CR" IS THE INTERRUPT CONTROL REGISTER OF ├╔┴#1. ╔T IS POLLED TO WAIT FOR
DATA BECOMING AVAILABLE IN THE SHIFT REGISTER ("CIA─ATA"). "CIA╙ERIAL├LK" IS
THE ╙LOW SERIAL BUS CLOCK LINE THAT IS USED FOR HANDSHAKING ON THE ╞AST BUS.
.%029! CIA╔CR = $DC0D
.%030! CIA╙ERIAL├LK = $DD00
.%031! CIA─ATA = $DC0C
.%032!
.%033! KERNEL╠ISTEN = $FFB1
.%034! KERNEL╙ECOND = $FF93
.%035! KERNEL├IOUT = $FFA8
.%036! KERNEL╒NLSN = $FFAE
.%037! KERNEL╙PINP = $FF47
.%038!
╘HIS IS THE ERROR CODE VALUE THIS PACKAGE RETURNS IF IT DETECTS THAT A DEVICE
IS NOT ╞AST.
.%039! ERR╬OT┬URST─EVICE = 10
.%040!
.%041! BURST╞ILENAME╠EN = BURST┬UF├OUNT
.%042!
.%043! BURST╧PEN = * ;(.┴=─EVICE, BURST┬UF=╞ILENAME, .╪=╬AME╠EN):<FIRST BLOCK>
╙ET UP FOR A BURST OPEN: CLEAR THE ╞AST FLAG AND THE DEVICE NOT PRESENT FLAG.
.%044! STX BURST╞ILENAME╠EN
.%045! PHA
.%046! LDA SERIAL╞LAG
.%047! AND #%10111111
.%048! STA SERIAL╞LAG
.%049! LDA #0
.%050! STA IO╙TATUS
.%051! PLA
├OMMAND THE DISK DEVICE TO ╠ISTEN. ╘HEN CHECK IF THE DEVICE IS PRESENT OR NOT
(BIT 7 OF IO╙TATUS). ╔F NOT PRESENT, RETURN THE KERNEL ERROR CODE.
.%052! JSR KERNEL╠ISTEN
.%053! BIT IO╙TATUS
.%054! BPL +
.%055!
.%056! DEV╬OT╨RESENT = *
.%057! JSR KERNEL╒NLSN
.%058! LDA #5
.%059! SEC
.%060! RTS
.%061!
╘ELL DISK DEVICE TO LISTEN ON THE COMMAND CHANNEL (CHANNEL #15).
.%062! + LDA #$6F
.%063! JSR KERNEL╙ECOND
╙END THE "╒0"+├╚╥$(159) BURST COMMAND HEADER.
.%064! LDA #"U"
.%065! JSR KERNEL├IOUT
.%066! BIT IO╙TATUS
.%067! BMI DEV╬OT╨RESENT
.%068! LDA #"0"
.%069! JSR KERNEL├IOUT
.%070! LDA #$9F
.%071! JSR KERNEL├IOUT
╙END THE FILENAME.
.%072! LDY #0
.%073! - LDA BURST┬UF,Y
.%074! JSR KERNEL├IOUT
.%075! INY
.%076! CPY BURST╞ILENAME╠EN
.%077! BCC -
╞INISH SENDING THE BURST COMMAND AND MAKE SURE THE DEVICE IS ╞AST.
.%078! JSR KERNEL╒NLSN
.%079! LDA SERIAL╞LAG
.%080! AND #$40
.%081! BNE +
.%082! SEC
.%083! LDA #ERR╬OT┬URST─EVICE
.%084! RTS
.%085!
─ISABLE INTERRUPTS.
.%086! + SEI
╨REPARE TO RECEIVE DATA AND SIGNAL THE DISK DRIVE TO START SENDING (BY
TOGGLING THE SLOW SERIAL ├LOCK LINE).
.%087! CLC
.%088! JSR KERNEL╙PINP
.%089! BIT CIA╔CR
.%090! LDA CIA╙ERIAL├LK
.%091! EOR #$10
.%092! STA CIA╙ERIAL├LK
╥EAD THE FIRST SECTOR OF THE FILE.
.%093! JSR BURST╥EAD
├HECK FOR ERRORS. ┬URST ERROR CODE 2 (FILE NOT FOUND) IS TRANSLATED TO ITS
KERNEL EQUIVALENT.
.%094! LDA BURST╙TATUS
.%095! CMP #2
.%096! BCC +
.%097! BNE SHORT╞ILE
.%098! SEC
.%099! LDA #4
.%100! + RTS
.%101!
├HECK IF THIS IS A ONE-BLOCK FILE.
.%102! SHORT╞ILE = *
.%103! CMP #$1F
.%104! BNE OPEN┼RROR
.%105! LDY BURST┬UF├OUNT
.%106! LDX #2
.%107!
╔F SO, WE HAVE TO READ THE TWO BYTES THAT THE DISK DRIVE FORGOT TO TELL US
ABOUT. ╞OR EACH BYTE, WE WAIT FOR FOR THE ╙HIFT ╥EGISTER ╥EADY SIGNAL, TOGGLE
THE CLOCK, AND READ THE SHIFT DATA REGISTER. ╔ CAN GET AWAY WITH READING THE
DATA REGISTER AFTER SENDING THE ACKNOWLEDGE SIGNAL TO THE DISK DRIVE BECAUSE ╔
AM RUNNING WITH INTERRUPTS DISABLED AND IT COULD NOT POSSIBLY SEND THE NEXT
BYTE BEFORE ╔ PICK UP THE CURRENT ONE. ╫E WOULDN'T WANT ANY ╬═╔S HAPPENING
WHILE DOING THIS, THOUGH.
.%108! SHORT╞ILE┬YTE = *
.%109! LDA #$08
.%110! - BIT CIA╔CR
.%111! BEQ -
.%112! LDA CIA╙ERIAL├LK
.%113! EOR #$10
.%114! STA CIA╙ERIAL├LK
.%115! LDA CIA─ATA
.%116! STA BURST┬UF,Y
.%117! INY
.%118! DEX
.%119! BNE SHORT╞ILE┬YTE
╙TORE THE UPDATED BYTE COUNT AND EXIT.
.%120! STY BURST┬UF├OUNT
.%121! CLC
.%122! RTS
.%123!
╔N THE EVENT OF A BURST ERROR, RE-ENABLE THE INTERRUPTS SINCE THE USER MIGHT
NOT CALL THE BURST├LOSE ROUTINE. ╥ETURN THE TRANSLATED ERROR CODE.
.%124! OPEN┼RROR = *
.%125! CLI
.%126! SEC
.%127! ORA #$10
.%128! RTS
.%129!
╥EAD THE NEXT SECTOR OF THE FILE.
.%130! BURST╥EAD = * ;( ) : BURST┬UF, BURST┬UF├OUNT, BURST╙TATUS
╫AIT FOR THE STATUS BYTE TO ARRIVE.
.%131! LDA #8
.%132! - BIT CIA╔CR
.%133! BEQ -
╘OGGLE CLOCK LINE FOR ACKNOWLEDGE.
.%134! LDA CIA╙ERIAL├LK
.%135! EOR #$10
.%136! STA CIA╙ERIAL├LK
╟ET STATUS BYTE AND CHECK. ╔F 2 OR MORE AND NOT $1╞, THEN AN ERROR HAS
OCCURRED. ╔F 0, THEN PREPARE TO READ 254 DATA BYTES.
.%137! LDA CIA─ATA
.%138! STA BURST╙TATUS
.%139! LDX #254
.%140! CMP #2
.%141! BCC ACTUAL╥EAD
.%142! CMP #$1F
.%143! BNE OPEN┼RROR
╔F STATUS BYTE IS $1╞, THEN GET THE NEXT BYTE, WHICH TELLS HOW MANY DATA BYTES
ARE TO FOLLOW.
.%144! LDA #8
.%145! - BIT CIA╔CR
.%146! BEQ -
.%147! LDX CIA─ATA
.%148! LDA CIA╙ERIAL├LK
.%149! EOR #$10
.%150! STA CIA╙ERIAL├LK
.%151!
.%152! ACTUAL╥EAD = *
.%153! STX BURST┬UF├OUNT
.%154! LDY #0
.%155!
╥EAD THE DATA BYTES AND PUT THEM INTO THE BURST BUFFER. ╘HE CLOCK LINE TOGGLE
VALUE IS COMPUTED BEFORE RECEIVING THE DATA FOR A LITTLE EXTRA ZIP. ╔ HAVEN'T
EXPERIMENTED WITH THIS, BUT YOU MIGHT BE ABLE TO TOGGLE THE CLOCK LINE BEFORE
RECEIVING THE DATA (HOWEVER, PROBABLY NOT FOR THE FIRST BYTE).
.%156! READ┬YTE = *
.%157! LDA CIA╙ERIAL├LK
.%158! EOR #$10
.%159! TAX
.%160! LDA #8
.%161! - BIT CIA╔CR
.%162! BEQ -
.%163! STX CIA╙ERIAL├LK
.%164! LDA CIA─ATA
.%165! STA BURST┬UF,Y
.%166! INY
.%167! CPY BURST┬UF├OUNT
.%168! BNE READ┬YTE
.%169! + CLC
.%170! RTS
.%171!
├LOSE THE BURST PACKAGE: SIMPLY ├╠╔.
.%172! BURST├LOSE = *
.%173! CLI
.%174! CLC
.%175! RTS
.%176!
.%177! ;========== MAIN PROGRAM ==========
.%178!
╘HIS IS THE WORD COUNTING APPLICATION CODE.
.%179! BK╫├ = $0E
.%180! BK╙ELECT = $FF00
.%181! KERNEL├HRIN = $FFCF
.%182! KERNEL├HROUT = $FFD2
.%183!
╘HE "WC╔N╫ORD" IS A BOOLEAN VARIABLE THAT TELLS WHETHER THE FILE SCANNER IS
CURRENTLY IN A WORD OR NOT. ╘HE ╠INES, ╫ORDS, AND ┬YTES ARE 24-BIT COUNTERS.
.%184! WC╔N╫ORD = 2 ;(1)
.%185! WC╠INES = 3 ;(3)
.%186! WC╫ORDS = 6 ;(3)
.%187! WC┬YTES = 9 ;(3)
.%188!
.%189! MAIN = *
╨UT THE KERNEL ╥╧═ AND ╔/╧ SPACE INTO CONTEXT THEN INITIALIZE THE COUNTING
VARIABLES.
.%190! LDA #BK╫├
.%191! STA BK╙ELECT
.%192! JSR WC╔NIT
╞OLLOW THE BURST READING PROCEDURE OUTLINE.
.%193! JSR WC╟ET╞ILENAME
.%194! JSR BURST╧PEN
.%195! BCC +
.%196! JSR REPORT┼RROR
.%197! RTS
.%198! / JSR WC╙CAN┬UFFER
.%199! LDA BURST╙TATUS
.%200! CMP #$1F
.%201! BEQ +
.%202! JSR BURST╥EAD
.%203! BCC -
.%204! JSR REPORT┼RROR
.%205! + JSR BURST├LOSE
╥EPORT THE NUMBERS OF LINES, WORDS, AND CHARACTERS AND THEN EXIT.
.%206! JSR WC╥EPORT
.%207! RTS
.%208!
╔NITIALIZE THE VARIABLES.
.%209! WC╔NIT = *
.%210! LDA #0
.%211! LDX #8
.%212! - STA WC╠INES,X
.%213! DEX
.%214! BPL -
.%215! STA WC╔N╫ORD
.%216! RTS
.%217!
╟ET THE DEVICE AND FILENAME FROM THE USER. ╥ETURNS PARAMETERS SUITABLE FOR
PASSING TO BURST╧PEN.
.%218! WC╟ET╞ILENAME = * ;() : BURST┬UF=╞ILENAME, .┴=─EVICE, .╪=╞ILENAME╠EN
─ISPLAY THE PROMPT.
.%219! LDX #0
.%220! - LDA PROMPT═SG,X
.%221! BEQ +
.%222! JSR KERNEL├HROUT
.%223! INX
.%224! BNE -
╟ET THE INPUT LINE FROM THE USER.
.%225! + LDX #0
.%226! - JSR KERNEL├HRIN
.%227! STA BURST┬UF,X
.%228! CMP #13
.%229! BEQ +
.%230! INX
.%231! BNE -
.%232! + JSR KERNEL├HROUT
┼XTRACT THE DEVICE NUMBER FROM THE START OF THE INPUT LINE. ╔F IT IS NOT
THERE, ASSUME DEVICE NUMBER 8.
.%233! LDA #8
.%234! CPX #2
.%235! BCC FILENAME┼XIT
.%236! LDY BURST┬UF+1
.%237! CPY #":"
.%238! BNE FILENAME┼XIT
.%239! SEC
.%240! LDA BURST┬UF
.%241! SBC #"A"-8
.%242! TAY
╔F A DEVICE NAME WAS PRESENT, THEN WE HAVE TO MOVE THE REST OF THE FILENAME
BACK OVER IT NOW THAT WE'VE EXTRACTED IT.
.%243! LDX #0
.%244! - LDA BURST┬UF+2,X
.%245! STA BURST┬UF,X
.%246! CMP #13
.%247! BEQ +
.%248! INX
.%249! BNE -
.%250! + TYA
.%251! FILENAME┼XIT = *
.%252! RTS
.%253!
.%254! PROMPT═SG = *
.%255! .ASC "ENTER FILENAME IN FORM FILENAME, OR A:FILENAME, "
.%256! .ASC "OR B:FILENAME, ..."
.%257! .BYTE 13
.%258! .ASC "WHERE 'A' IS FOR DEVICE 8, 'B' IS FOR DEVICE 9, ..."
.%259! .BYTE 13,0
.%260!
╙CAN THE BURST BUFFER AFTER READING A SECTOR INTO IT.
.%261! WC╙CAN┬UFFER = *
.%262! LDY #0
.%263! CPY BURST┬UF├OUNT
.%264! BNE +
.%265! RTS
.%266! + LDX WC╔N╫ORD
.%267! - LDA BURST┬UF,Y
.%268! ; JSR KERNEL├HROUT ;UNCOMMENT THIS LINE TO ECHO THE DATA READ
.%269! CMP #13
.%270! BNE +
╔F THE CURRENT CHARACTER IS A CARRIAGE RETURN, THEN INCREMENT THE LINE COUNT.
.%271! INC WC╠INES
.%272! BNE +
.%273! INC WC╠INES+1
.%274! BNE +
.%275! INC WC╠INES+2
╔F THE CHARACTER IS A ╘┴┬, ╙╨┴├┼, OR A ╥┼╘╒╥╬, THEN IT IS A ─ELIMITER;
OTHERWISE, IT IS CONSIDERED A ╠ETTER.
.%276! + CMP #33
.%277! BCS IS╠ETTER
.%278! CMP #" "
.%279! BEQ IS─ELIMITER
.%280! CMP #13
.%281! BEQ IS─ELIMITER
.%282! CMP #9
.%283! BEQ IS─ELIMITER
.%284!
.%285! IS╠ETTER = *
╔F THE CHARACTER IS A ╠ETTER AND THE PREVIOUS ONE WAS A ─ELIMITER, THEN
INCREMENT THE WORD COUNT.
.%286! CPX #1
.%287! BEQ SCAN├ONT
.%288! LDX #1
.%289! INC WC╫ORDS
.%290! BNE SCAN├ONT
.%291! INC WC╫ORDS+1
.%292! BNE SCAN├ONT
.%293! INC WC╫ORDS+2
.%294! JMP SCAN├ONT
.%295!
.%296! IS─ELIMITER = *
.%297! LDX #0
.%298!
.%299! SCAN├ONT = *
.%300! INY
.%301! CPY BURST┬UF├OUNT
.%302! BCC -
┴DD THE NUMBER OF BYTES IN THE BURST BUFFER TO THE TOTAL BYTE COUNT FOR THE
FILE.
.%303! CLC
.%304! LDA WC┬YTES
.%305! ADC BURST┬UF├OUNT
.%306! STA WC┬YTES
.%307! BCC +
.%308! INC WC┬YTES+1
.%309! BNE +
.%310! INC WC┬YTES+2
.%311! + STX WC╔N╫ORD
.%312! RTS
.%313!
╥EPORT THE NUMBER OF LINES, WORDS, AND BYTES READ. ╒SES A "PRINTF" TYPE OF
SCHEME.
.%314! WC╥EPORT = *
.%315! LDX #0
.%316! - LDA REPORT═SG,X
.%317! BEQ REPORT┼XIT
.%318! CMP #13
.%319! BCS +
.%320! STX 14
.%321! TAX
.%322! LDA 2,X
.%323! STA 15
.%324! LDA 0,X
.%325! LDY 1,X
.%326! LDX 15
.%327! JSR PUTNUM
.%328! LDX 14
.%329! JMP REPORT├ONT
.%330! + JSR KERNEL├HROUT
.%331! REPORT├ONT = *
.%332! INX
.%333! BNE -
.%334! REPORT┼XIT = *
.%335! RTS
.%336!
.%337! REPORT═SG = *
.%338! .BYTE 13
.%339! .ASC "LINES="
.%340! .BYTE WC╠INES
.%341! .ASC ", WORDS="
.%342! .BYTE WC╫ORDS
.%343! .ASC ", CHARS="
.%344! .BYTE WC┬YTES,27
.%345! .ASC "Q"
.%346! .BYTE 13,0
.%347!
╥EPORTS THE ERROR NUMBER GIVEN IN THE .┴ REGISTER. ├ALLED AFTER AN ERROR IS
RETURNED FROM A BURST ROUTINE.
.%348! REPORT┼RROR = * ;( .┴=ERR╬UM )
.%349! PHA
.%350! LDX #0
.%351! - LDA ERROR═SG,X
.%352! BEQ +
.%353! JSR KERNEL├HROUT
.%354! INX
.%355! BNE -
.%356! + PLA
.%357! LDY #0
.%358! LDX #0
.%359! JSR PUTNUM
.%360! LDA #13
.%361! JSR KERNEL├HROUT
.%362! RTS
.%363!
.%364! ERROR═SG = *
.%365! .ASC "*** I/O ERROR #"
.%366! .BYTE 0
.%367!
.%368! ;==========LIBRARY==========
.%369!
╥OUTINE TO PRINT OUT THE 24-BIT NUMBER GIVEN IN .┴┘╪.
.%370! LIBWORK = $60
.%371! ITOA┬IN = LIBWORK
.%372! ITOA┬CD = LIBWORK+3
.%373! ITOA╞LAG = LIBWORK+7
.%374!
.%375! PUTNUM = *
╔NITIALIZE BINARY AND ┬├─ (┬INARY ├ODED ─ECIMAL) REPRESENTATIONS OF NUMBER.
.%376! STA ITOA┬IN+0
.%377! STY ITOA┬IN+1
.%378! STX ITOA┬IN+2
.%379! LDX #3
.%380! LDA #0
.%381! - STA ITOA┬CD,X
.%382! DEX
.%383! BPL -
.%384! STA ITOA╞LAG
.%385! LDY #24
.%386! SED
.%387!
╥OTATE EACH BIT OUT OF THE BINARY NUMBER AND THEN MULTIPLY THE ┬├─ NUMBER BY
TWO AND ADD THE BIT IN. ┼FFECTIVELY, WE ARE SHIFTING THE BITS OUT OF THE
BINARY NUMBER AND INTO THE ┬├─ REPRESENTATION OF THE NUMBER.
.%388! ITOA╬EXT┬IT = *
.%389! ASL ITOA┬IN+0
.%390! ROL ITOA┬IN+1
.%391! ROL ITOA┬IN+2
.%392! LDX #3
.%393! - LDA ITOA┬CD,X
.%394! ADC ITOA┬CD,X
.%395! STA ITOA┬CD,X
.%396! DEX
.%397! BPL -
.%398! DEY
.%399! BNE ITOA╬EXT┬IT
.%400! CLD
╘AKE THE ┬├─ BYTES AND SPIT OUT THE TWO DIGITS THEY CONTAIN.
.%401! LDX #0
.%402! LDY #0
.%403! - LDA ITOA┬CD,X
.%404! JSR ITOA╨UT╚EX
.%405! INX
.%406! CPX #4
.%407! BCC -
.%408! RTS
.%409!
.%410! ITOA╨UT╚EX = *
.%411! PHA
.%412! LSR
.%413! LSR
.%414! LSR
.%415! LSR
.%416! JSR ITOA╨UT─IGIT
.%417! PLA
.%418! AND #$0F
.%419!
╨RINT OUT THE INDIVIDUAL DIGITS OF THE NUMBER. ╔F THE CURRENT DIGIT IS ZERO
AND ALL DIGITS SO FAR HAVE BEEN ZERO, THEN DON'T OUTPUT ANYTHING, UNLESS IT IS
THE LAST DIGIT OF THE NUMBER.
.%420! ITOA╨UT─IGIT = *
.%421! CMP ITOA╞LAG
.%422! BNE +
.%423! CPY #7
.%424! BCC ITOA╨UT─IGIT┼XIT
.%425! + ORA #$30
.%426! STA ITOA╞LAG
.%427! JSR KERNEL├HROUT
.%428! ITOA╨UT─IGIT┼XIT = *
.%429! INY
.%430! RTS
5. ╒╒┼╬├╧─┼─ ╨╥╧╟╥┴═
╚ERE IS THE BINARY EXECUTABLE IN UUENCODED FORM. ╘HE ├╥├32 OF IT IS
3676144922. ╠╧┴─ AND ╥╒╬ IT LIKE A REGULAR ┬┴╙╔├ PROGRAM.
BEGIN 640 WC
═└1╨<'└╚└╟┬└╫,├└╨(#╚@├╥└╓-3└╥(%!/5╘52(0└└└└└└3!$=┴╧](╦1╨**;^-
═'└╩╔└(60:""╤_╥20$└<@╦╧^╔!3┴@╩6\@─_^╔52"╚_╥20,.╬╔,""╚_┌╞?(*├_
═╚└"┘└└╠@╩/_(╤/^0]2"╬_┌╘<"┬┼└╘└0╪╩0╔@>!@@1_\╠#=╥═└-╒)$(╘└╫2"]
═'*7^╥0*0!=└$.*─$8,─?╘"&─_┌("╩0@╠#=╙╨^┌╘└╫4─0├0#=╦0╙<╞0└+╥,╦0
═┘╪3_&&!8.└─08*─(+└╫<\/╬═└-╒)$(╘└╫:╘,╫(7^╚╧[)└╔└6╥1_0╫:─(+└╫<
═\/╬╬#-╥═└-╒)$(╘└╫8;_╚└"═└-╒)$*╩╔""╨-╫/#[├@#=╦0╙<╞0└+╥,3_╘.48
═8%@88*─.├0#_(#╘=($─=(",<─└0@╚!┘@(└4>╔?[)'_└((+╘<─/(@╚!╪@#┴╘@
═6╤┘@╩0"┬")4#╥┴#[┴0)@╚@"]├1╫╨!┬#2_^├0]:(└(,__╟0└+╥0╫╨└^├0\╥#2
═╠┌─(╪└*0'╩╨!"\└┌╘!<╪╦0└+┌3╞╚╚@"]└@╬=└└╧)#?└#┌-#╙╞&!%3┼1%4┬!&
═24╤%3─%-12!)3┬!&3╒)-($9)3$5.04╒%+"!/4┬!!.─9)3$5.04╒%+"!/4┬!"
═.─9)3$5.04╒%+"└╬+┬╪-5╘┴%4─4@)╘$╟($┼3($9/4┬!$159)0╘4@."╨@)╘(╟
═($┼3($9/4┬!$159)0╘4@.2╨@+┬╪╬#0"@└,3_╘└%@╔@*┘└└╧)#=└*┘@/0!╬8$
═╘└+╞!<─┴╠└╙)(/└;╥0╫╨%\─)\!/@└?└1╚@'╞!═└+┘@?0!^8(3$0>╚@#(╤/^0
═╤1┬┼"67_┴0╞0!╬8*╘└+╞"╪8"8*(└╧8(>\!_)#;└5┴@┌╩═0*%#[4└═└&╞#╥#,
═'╩8.3'╪>(-+_┌-#<8└╒,24┘%4╙╘#+"!73╒)$4╙╘&+"!#2$%24╙╘)&╒$-└$┬┬
═└+╓\'╧└&(-+_┌-#╒:*└└╚@└@╙!┌╔#2#2_╓└╩*┬╚@22]/($524─]2(",└┴6"$
═889┬╚@.╔└)5├╥┴#[┴6>@&/@&8"9┴)╞*┬└[5├=6.58\╚0]╪├0[-┬┬└*└└═6,@
─!!_╚╪└20]╞!(2─╔*2┬└/'╓@╔#\5╟╘└3└!┘└'"3"%9╥#2_\┴@└└└└
└
END
6. ╥┼╞┼╥┼╬├┼╙
[1] ├OMMODORE ┬USINESS ═ACHINES, _├OMMODORE_1571_─ISK_─RIVE_╒SER'S_╟UIDE_,
├┬═, 1985.
[2] ╥AINER ┼LLINGER, _1571_╔NTERNALS_, ┴BACUS ╙OFTWARE, ╩UNE 1986.
===============================================================================
╬EXT ╔SSUE: (HOPEFULLY!)
╠EARNING ═╠ - ╨ART 4
╔N THE NEXT ISSUE WE'LL EMBARK ON A PROJECT OF MAKING A SPACE INVADERS STYLE
GAME FOR THE ├=64/128 USING THE ╦┼╥╬┴╠ ROUTINES WE'VE LEARNED.
╘HE ─EMO ├ORNER: ╞╠╔ - MORE COLOR TO THE SCREEN
┴LL OF US HAVE HEARD COMPLAINTS ABOUT THE COLOR CONSTRAINTS ON ├64.
╞╠╔ PICTURE CAN HAVE ALL OF THE 16 COLORS IN ONE CHAR POSITION. ╫HAT THEN
IS THIS ╞╠╔ AND HOW IT IS DONE ?
╘HE 1351 ═OUSE ─EMYSTIFIED
┴N INDEPTH LOOK AT HOW THE 1351 MOUSE OPERATES AND HOW TO ACCESS IT WITHIN
YOUR OWN ═╠ PROGRAMS. ╞OR ┬ASIC PROGRAMMERS, A DRIVER FOR THE 80 COLUMN SCREEN
IS ALSO SUPPLIED.
╠╔╘╘╠┼ ╥┼─ ╥┼┴─┼╥: ═╙-─╧╙ FILE READER FOR THE 128 AND 1571/81 DRIVES.
╘HIS ARTICLE WILL PRESENT A PACKAGE THAT READS ═╙-─╧╙ FILES AND THE ROOT
DIRECTORY OF ═╙-─╧╙ DISKS. ╘HIS PACKAGE WILL USE THE DYNAMIC MEMORY ALLOCATION
PACKAGE INTRODUCED IN ╚ACKING ╔SSUE #2 TO ALLOW LARGE FILES TO BE READ IN.
╘HE APPLICATION-LEVEL CODE HASN'T BEEN FINALIZED YET, BUT IT WILL PROBABLY USE
A MENU-ORIENTED FULL-SCREEN DISPLAY AND WILL READ AND TRANSLATE ═╙-─╧╙ AND
├OMMODORE FILES.
=============================================================================
┼╬─ OF ├OMMODORE ╚ACKING ╔SSUE 3.
=============================================================================